home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / thesource-7.lha / Source / Chunky2Planar.lha / Chunky2Planar / c2p_020_FastRam.s < prev    next >
Text File  |  1994-02-18  |  4KB  |  195 lines

  1. ; Chunky2Planar algorithm.
  2. ;
  3. ;     Cpu only solution
  4. ;    Optimised for 020+fastram
  5. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  6.  
  7.     output    five_pass.o
  8.     opt    l+    ;Linkable code
  9.     opt    c+    ;Case sensitive
  10.     opt    d-    ;No debugging information
  11.     opt    m+    ;Expand macros in listing
  12.     opt    o-    ;No optimisation
  13.     
  14.     xdef    _chunky2planar
  15.         
  16. ;  a0 -> chunky pixels
  17. ;  a1 -> plane0
  18.  
  19. width        equ    320        ; must be multiple of 32
  20. height        equ    200
  21. plsiz        equ    (width/8)*height
  22.  
  23. wordmerge    macro
  24.     ; i1    i2    tmp
  25.     ; \1    \2    \3
  26. ;; speedup            \1 AB \2 CD
  27.     move.l    \2,\3        \3 = CD
  28.     move.w    \1,\2        \2 = CB
  29.     swap    \2        \2 = BC
  30.     move.w    \2,\1        \1 = AC
  31.     move.w    \3,\2        \2 = BD
  32.     endm
  33.  
  34.         
  35. merge    macro    ;    i1    i2    t3    t4    m    s
  36.         ;    \1    \2    \3    \4    \5    \6
  37.         ;    output as \1,\3
  38.             ; \1 = abqr
  39.             ; \2 = ijyz
  40.     move.l    \5,\3    ; \3 = 0x0x
  41.     move.l    \5,\4    ; \4 = 0x0x
  42.     and.l    \1,\3    ; \3 = 0b0r
  43.     and.l    \2,\4    ; \4 = 0j0z
  44.     eor.l    \3,\1    ; \1 = a0q0
  45.     eor.l    \4,\2    ; \2 = i0y0
  46.     IFEQ    \6-1
  47.     add.l    \3,\3
  48.     ELSE
  49.     lsl.l    #\6,\3    ; \3 = b0r0
  50.     ENDC
  51.     lsr.l    #\6,\2    ; \2 = 0i0y
  52.     or.l    \2,\1        ; \1 = aiqy
  53.     or.l    \4,\3        ; \2 = bjrz
  54.     endm
  55.         
  56. _chunky2planar:
  57.         ;a0 = chunky buffer
  58.         ;a1 = first bitplane
  59.         
  60.     movem.l    d2-d7/a2-a6,-(sp)
  61.     move.l    a0,a2
  62.     add.l    #plsiz*8,a2    ;a2 = end of chunky buffer
  63.     
  64.     ;; Sweep thru the whole chunky data once,
  65.     ;; Performing 3 merge operations on it.
  66.     
  67.     move.l    #$00ff00ff,a3    ; load byte merge mask
  68.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  69.     
  70. firstsweep
  71.  
  72.     ; pass 1
  73.     movem.l    (a0),d0-d7    ;8+4n     40    cycles
  74.     ; d0-7 = abcd efgh ijkl mnop qrst uvwx yzAB CDEF
  75.     ;; 40c
  76.     
  77.     wordmerge    d0,d4,a6    ;d0/4 = abqr cdst
  78.     wordmerge    d1,d5,a6    ;d1/5 = efuv ghwx
  79.     wordmerge    d2,d6,a6    ;d2/6 = ijyz klAB
  80.     wordmerge    d3,d7,a6     ;d3/7 = mnCD opEF
  81.     ;; 4*14c
  82.  
  83.     ; save off a bit of shit
  84.     move.l    d7,a6
  85.     move.l    d6,a5
  86.     ;; 4c
  87.         
  88.     ; pass 2
  89.     merge    d0,d2,d6,d7,a3,8    ;d0/d6 = aiqy bjrz
  90.     merge    d1,d3,d7,d2,a3,8    ;d1/d7 = emuc fnvD
  91.     ;; 2*24
  92.     
  93.     ; pass 3
  94.     merge    d0,d1,d2,d3,a4,4    ;d0/d2  = ae74... ae30...
  95.     merge    d6,d7,d3,d1,a4,4    ;d6/d3  = bf74... bf30...
  96.     ;; 2*24
  97.     
  98.     move.l    d0,(a0)+
  99.     move.l    d2,(a0)+
  100.     move.l    d6,(a0)+
  101.     move.l    d3,(a0)+
  102.     ;; 4*4c
  103.     
  104.     ; bring it back
  105.     move.l    a6,d7
  106.     move.l    a5,d6
  107.     ;; 2*2c
  108.         
  109.     ; pass 2
  110.     merge    d4,d6,d0,d1,a3,8    ;d4/d0 = cksA dltB
  111.     merge    d5,d7,d1,d6,a3,8    ;d5/d1 = gowE hpxF
  112.     ;; 2*24c
  113.     
  114.     ; pass 3            
  115.     merge    d4,d5,d6,d7,a4,4    ;d4/d6 = cg74.. cg30..
  116.     merge    d0,d1,d7,d5,a4,4    ;d0/d7 = dh74.. dh30..
  117.     ;; 2*24c
  118.         
  119.     move.l    d4,(a0)+
  120.     move.l    d6,(a0)+
  121.     move.l    d0,(a0)+
  122.     move.l    d7,(a0)+
  123.     ;; 4*4c
  124.     
  125.     cmp.l    a0,a2        ;; 4c
  126.     bne.w    firstsweep    ;; 6c
  127.  
  128.     ;; 338
  129.     
  130.     ; (a0)     ae74.. ae30.. bf74.. bf30.. cg74.. cg30.. dh74.. dh30..
  131.  
  132. ;    bra.w    exit
  133.     
  134.     sub.l    #plsiz*8,a0
  135.     move.l    #$33333333,a5
  136.     move.l    #$55555555,a6
  137.  
  138.  
  139.     lea    plsiz*4(a1),a1    ;a2 = plane4
  140.     
  141. secondsweep
  142.  
  143.     move.l    (a0),d0
  144.     move.l    8(a0),d1
  145.     move.l    16(a0),d2
  146.     move.l    24(a0),d3
  147.     ;; 6+3*7
  148.     
  149.     ;; pass 4    
  150.     merge    d0,d2,d6,d7,a5,2    ;d0/d6 = aceg76.. aceg54..
  151.     merge    d1,d3,d7,d2,a5,2    ;d1/d7 = bdhf76.. bdhf54..
  152.     ;; 24*2c
  153.     
  154.     ;; pass 5    
  155.     merge    d0,d1,d2,d3,a6,1    ;d0/d2 = abcd7... abcd6...
  156.     merge    d6,d7,d3,d1,a6,1    ;d6/d3 = abcd5... abcd4...
  157.     ;; 24*2c
  158.  
  159.     move.l    d0,plsiz*3(a1)
  160.     move.l    d2,plsiz*2(a1)
  161.     move.l    d6,plsiz*1(a1)
  162.     move.l    d3,(a1)+
  163.     ;;3*5+4c
  164.         
  165.     move.l    4(a0),d0
  166.     move.l    12(a0),d1
  167.     move.l    20(a0),d2
  168.     move.l    28(a0),d3
  169.     ;;4*7c
  170.     ;; pass 4    
  171.     merge    d0,d2,d6,d7,a5,2    ;d0/d6 = aceg32.. aceg10..
  172.     merge    d1,d3,d7,d2,a5,2    ;d1/d7 = bdhf32.. bdhf10..
  173.     ;;2*24
  174.     ;; pass 5    
  175.     merge    d0,d1,d2,d3,a6,1    ;d0/d2 = abcd3... abcd2...
  176.     merge    d6,d7,d3,d1,a6,1    ;d6/d3 = abcd1... abcd0...
  177.     ;;2*24
  178.     
  179.     move.l    d0,-4-plsiz*1(a1)
  180.     move.l    d2,-4-plsiz*2(a1)
  181.     move.l    d6,-4-plsiz*3(a1)
  182.     move.l    d3,-4-plsiz*4(a1)
  183.     ;;4*5
  184.     
  185.     add.w    #32,a0    ;;4c
  186.     cmp.l    a0,a2    ;;4c
  187.     bne.w    secondsweep    ;;6c
  188.  
  189.     ;300
  190.     
  191. exit    
  192.     movem.l    (sp)+,d2-d7/a2-a6
  193.     rts
  194.     
  195.